home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
demo
/
mag
/
Infamia3.lha
/
infamia03
/
mv_code
/
copper
/
mask1.s
next >
Wrap
Text File
|
1996-07-24
|
11KB
|
288 lines
************************************
* /\/\ *
* / \ *
* / /\/\ \ O R B_I D *
* / / \ \ / / *
* / / __\ \ / / *
* ¯¯ \ \¯¯/ / I S I O N S *
* \ \/ / *
* \ / *
* \/ *
* Feel the DEATH inside! *
************************************
* Coded by: *
* The Dark Coder / Morbid Visions *
************************************
* ATTENZIONE:
; Questo sorgente e` basato sulla Lezione11h4.s del Corso di Randy
; Mostra come effettuare il mascheramento anche per posizioni verticali
; maggiori di $80. Commenti alla fine del sorgente
; I credits per il sorgente originale sono di Randy - RJ
; Ehi Randy spero che non te la prendi se miglioro il tuo lavoro!
; Friendship RULEZ! :)))) (The Dark Coder)
SECTION DK,code
incdir "Infamia:MV_code/"
include MVstartup.s ; Codice di startup: prende il
; controllo del sistema e chiama
; la routine START: ponendo
; A5=$DFF000
;5432109876543210
DMASET EQU %1000001010000000 ; solo copper DMA
START:
lea $dff000,a5
move #DMASET,dmacon(a5) ; DMACON - abilita bitplane, copper
; e sprites.
move.l #COPPERLIST,cop1lc(a5) ; Puntiamo la nostra COP
move d0,copjmp1(a5) ; Facciamo partire la COP
mouse:
; notare il doppio controllo sulla sincronia
; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
move.l #$1ff00,d1 ; bit per la selezione tramite AND
move.l #$13000,d2 ; linea da aspettare = $130, ossia 304
.Waity1
move.l vposr(a5),d0 ; vposr e vhposr
and.l d1,d0 ; seleziona solo i bit della pos. verticale
cmp.l d2,d0 ; aspetta la linea $130 (304)
bne.s .waity1
.Waity2
move.l vposr(a5),d0
and.l d1,d0
cmp.l d2,d0
beq.s .waity2
btst #2,potinp(a5) ; tasto destro premuto?
beq.s .noMuovi ; se si non eseguire MuoviCopper
bsr.s MuoviCopper ; Routine che sfrutta il mascheramento del WAIT
.noMuovi
btst #6,$bfe001 ; mouse premuto?
bne.s mouse
rts
*****************************************************************************
MuoviCopper:
tst.b SuGiu ; Dobbiamo salire o scendere? se SuGiu e'
; azzerata, (cioe' il TST verifica il BEQ)
; allora saltiamo a VAIGIU, se invece e' a $FF
; (se cioe' questo TST non e' verificato)
; continuiamo salendo (facendo dei subq)
beq.w VAIGIU
cmp.b #$80,BARRA ; siamo arrivati alla linea $80?
sne SuGiu ; se si, siamo in cima e dobbiamo scendere
; Nel codice di randy c'era una Beq che saltava
; ad un pezzo di codice che azzerava il flag.
; Usando la Scc si va piu` veloci e si
; risparmia memoria. E` consigliabile usare
; sempre la Scc per alterare i flag
subq.b #1,BARRA
rts
VAIGIU:
cmp.b #$F0,BARRA ; siamo arrivati alla linea $F0?
seq SuGiu ; se si, siamo in fondo e dobbiamo risalire
; Anche qui abbiamo sostituito la BEQ di
; Randy con una SEQ
addq.b #1,BARRA
rts
SuGiu: dc.b 0 ; flag direzione
*****************************************************************************
SECTION GRAPHIC,DATA_C
COPPERLIST:
dc.w $100,$200
dc.w $180,$000 ; Inizio la cop col colore NERO
dc.w $2c07,$FFFE ; una piccola barretta fissa verde
dc.w $180,$010
dc.w $2d07,$FFFE
dc.w $180,$020
dc.w $2e07,$FFFE
dc.w $180,$030
dc.w $2f07,$FFFE
dc.w $180,$040
dc.w $3007,$FFFE
dc.w $180,$030
dc.w $3107,$FFFE
dc.w $180,$020
dc.w $3207,$FFFE
dc.w $180,$010
dc.w $3307,$FFFE
dc.w $180,$000
BARRA:
dc.w $8407,$FFFE ; aspetto la linea $79 (WAIT NORMALE!)
; questo wait e' il "BOSS" dei wait
; mascherati seguenti, infatti lo seguono
; come degli scagnozzi: se questo wait
; scende di 1, tutti i wait mascherati
; sottostanti scendono di 1, eccetera.
dc.w $180,$300 ; inizio la barra rossa: rosso a 3
dc.w $80E1,$80FE ; Questa WAIT attende la fine di una riga.
; Si tratta di una WAIT con posizione
; verticale mascherata. Poiche` questa
; istruzione va eseguita DOPO la riga
; $80, il bit alto (non mascherabile)
; deve essere settato a 1.
dc.w $0001,$FFFE ; questa WAIT e` un istruzione "inutile"
; infatti non blocca mai il copper.
; Il suo scopo e` quello di far perdere
; un po' di tempo al copper in maniera che
; la seguente CMOVE venga eseguita quando
; il pennello elettronico ha iniziato la
; riga seguente.
dc.w $180,$600 ; rosso a 6
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$900 ; rosso a 9
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$c00 ; rosso a 12
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$f00 ; rosso a 15 (al massimo)
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$c00 ; rosso a 12
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$900 ; rosso a 9
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$600 ; rosso a 6
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$300 ; rosso a 3
UltimaFineRiga:
dc.w $80E1,$80FE ; aspetta fine riga
dc.w $0001,$FFFE ; WAIT inutile che rallenta il copper
dc.w $180,$000 ; colore NERO
dc.w $fd07,$FFFE ; aspetto la linea $FD
dc.w $180,$00a ; blu intensita' 10
dc.w $fe07,$FFFE ; linea seguente
dc.w $180,$00f ; blu intensita' massima (15)
dc.w $FFFF,$FFFE ; FINE DELLA COPPERLIST
end
Nel corso di Randy nella lezione11h4.s viene mostrato come realizzare una
barretta con il copper mediante delle WAIT con posizione verticale mascherata,
tecnica che permette di velocizzare l'aggiornamento della copperlist rispetto
al caso in cui vengono usate WAIT con posizioni verticali NON mascherate.
Nel sorgente viene anche asserita l'impossibilita` di adottare questa tecnica
nelle posizioni verticali comprese tra $80 e $FF. Citiamo direttamente dal
commento della lezione11h4.s:
"Quindi, si puo' dire che il mascheramento funziona nella parte alta dello
schermo da $00 a $7f circa, e sotto la zona NTSC, ossia dopo il $FFDF,$FFFE."
Ebbene questo e` falso!!!
Come spieghiamo anche nell'articolo "More Advanced Copper" su questo
numero di Infamia, e` possibilissimo usare il mascheramento nelle posizioni
comprese tra $80 e $FF con un semplicissimo accorgimento. Il problema, infatti
nasce dal fatto che il bit piu` alto della posizione verticale del copper
non e` mascherabile, e quindi viene usato dal copper per il confronto della
posizione specificata nella WAIT (o nella SKIP) e la posizione del pennello
elettronico.
Randy nel sorgente lezione11h4.s del suo corso utilizza delle WAIT con i 7 bit
bassi della posizione verticale mascherati per attendere la fine di una riga.
Le WAIT che Randy utilizza sono delle DC.W $00E1,$80FE, che hanno il bit 8
della posizione verticale da attendere (cioe` il bit 15 della prima WORD)
settato a 0. Se una tale WAIT viene eseguita quando il pennello elettronico si
trova ad una posizione verticale con il bit 8 settato a 0 (cioe` minore di $80
o maggiore di $FF), essendo i bit 8 di valore uguale e poiche` gli altri bit
della posizione verticale sono disabilitati, si tiene conto della posizione
orizzontale, e pertanto la WAIT attende la fine della riga come voluto.
Se invece una tale WAIT viene eseguita quando il pennello elettronico si
trova ad una posizione verticale con il bit 8 settato a 1 (cioe` maggiore o
uguale ad $80 e minore o uguale a $FF), essendo il bit 8 della pos. verticale
del pennello elettronico maggiore del bit 8 della posizione specificata nella
WAIT, il copper considera la posizione specificata dalla WAIT minore di quella
del pennello elettronico e NON aspetta la fine della riga.
Come si fa allora ad aspettare la fine di una riga la cui pos. verticale ha il
bit 8 settato a 1? E` molto semplice, mediante una WAIT cosi` composta:
DC.W $80E1,$80FE
Questa WAIT si differenzia da q